//#include<bits/stdc++.h>
//using namespace std;
//const double N = 1e-8;
//int main()
//{
//    double x, y, a, b, t, c;
//    cin >> x >> y >> t >> a >> b >> c;
//    if (x <= t)
//    {
//        cout << (100 - x) / c;
//    }
//    else
//    {
//        double m = 0, n = 0;
//        m = (100 - x) / b;
//        n = (x - t) / y;
//        n = n + (100 - t) / c;
//        cout << min(m, n);
//    }
//    return 0;
//}
//#include<bits/stdc++.h>
//using namespace std;
//int a[510][510];
//int b[510][510];
//int xrr[4] = { 0,0,1,-1 };
//int yrr[4] = { 1,-1,0,0 };
//int main()
//{
//    int n;
//    cin >> n;
//    for (int i = 0; i < n; i++)
//        for (int j = 0; j < n; j++)
//            cin >> b[i][j];
//    a[0][0] = b[0][0];
//    for (int i = 0; i < n; i++)
//        for (int j = 0; j < n; j++)
//        {
//            int Min = 0x3f3f3f3f;
//            for (int k = 0; k < 4; k++)
//            {
//                int x1 = i + xrr[k];
//                int y1 = j + yrr[k];
//                if (x1 >= 0 && y1 >= 0 && x1 < n && y1 < n)
//                    Min = min(Min, b[x1][y1]);
//            }
//            a[i][j] = max(b[i][j], Min);
//        }
//    cout << a[n - 1][n - 1];
//}
//#include<bits/stdc++.h>
//using namespace std;
//string div(string a, int b, int& k)
//{
//    string c;
//    for (int i = 0; i < a.size(); i++)
//    {
//        k = k * 10 + a[i] - '0';
//        if (k / b && c.empty())
//        {
//            c.push_back(k / b + '0');
//            k = k % b;
//        }
//        else if (!c.empty())
//        {
//            c.push_back(k / b + '0');
//            k = k % b;
//        }
//    }
//    if (c.empty())
//        c += '0';
//    return c;
//}
//int main()
//{
//    string a;
//    int b;
//    cin >> a >> b;
//    if (a.size() <= 10)
//    {
//        int c = 0;
//        for (auto ch : a)
//            c = c * 10 + ch - '0';
//        int A = max(c, b);
//        int B = min(c, b);
//        while (B)
//        {
//             c = A % B;
//            A = B;
//            B = c;
//        }
//        cout << A;
//    }
//    else
//    {
//        int c;
//        div(a, b, c);
//        int d = b;
//        b = c;
//        int A = max(d, b);
//        int B = min(d, b);
//        while (B)
//        {
//            int c = A % B;
//            A = B;
//            B = c;
//        }
//        cout << A;
//    }
//}
//#include<bits/stdc++.h>
//using namespace std;
//int a[510][510];
//int b[510][510];
//int xrr[4] = { 0,0,1,-1 };
//int yrr[4] = { 1,-1,0,0 };
//int main()
//{
//    int n;
//    cin >> n;
//    for (int i = 0; i < n; i++)
//        for (int j = 0; j < n; j++)
//            cin >> b[i][j];
//    a[0][0] = b[0][0];
//    for (int i = 0; i < n; i++)
//        for (int j = 0; j < n; j++)
//        {
//            int Min = 0x3f3f3f3f;
//            for (int k = 0; k < 4; k++)
//            {
//                int x1 = i + xrr[k];
//                int y1 = j + yrr[k];
//                if (x1 >= 0 && y1 >= 0 && x1 < n && y1 < n)
//                    Min = min(Min, a[x1][y1]);
//            }
//            a[i][j] = max(b[i][j], Min);
//        }
//    cout << a[n - 1][n - 1];
//}
//#include<bits/stdc++.h>
//using namespace std;
//const int N = 5e5 + 10;
//long long qian[N];
//long long a[N];
//long long b[N];
//int main()
//{
//    int n;
//    cin >> n;
//    for (int i = 1; i <= n; i++)
//    {
//        cin >> a[i];
//        qian[i] = qian[i - 1] + a[i];
//    }
//    int q;
//    cin >> q;
//    memset(b, 0x3f3f3f3f, sizeof b);
//        while (q--)
//        {
//            int l, r;
//            cin >> l >> r;
//            long long Max = 0, Min = 0;
//            long long sum = 0;
//            if (b[l][r] == 0x3f3f3f3f)
//                for (int i = l; i <= r; i++)
//                    for (int j = i; j <= r; j++)
//                    {
//                        int sum = qian[j] - qian[i - 1];
//                        Max = max<long long>(Max, sum);
//                        Min = min<long long>(Min, sum);
//                    }
//            b[l][r] = max(Max, -Min) << endl;
//            cout << b[l][r];
//        }
//}
//#include<bits/stdc++.h>
//using namespace std;
//string div(string a, int b, int& k)
//{
//    string c;
//    for (int i = 0; i < a.size(); i++)
//    {
//        k = k * 10 + a[i] - '0';
//        if (k / b && c.empty())
//        {
//            c.push_back(k / b + '0');
//            k = k % b;
//        }
//        else if (!c.empty())
//            k = k % b;
//    }
//    return c;
//}
//int main()
//{
//    string a;
//    int b;
//    cin >> a >> b;
//    int c = 0;
//    div(a, b, c);
//    int d = c;
//    while (d)
//    {
//        c = b % d;
//        b = d;
//        d = c;
//    }
//    cout << b;
//}
//#include<bits/stdc++.h>
//using namespace std;
//string div(string a, int b, int& k)
//{
//    string c;
//    for (int i = 0; i < a.size(); i++)
//    {
//        k = k * 10 + a[i] - '0';
//        k = k % b;
//    }
//    return c;
//}
//const int N = 1e6 + 10;
//char a[N];
//int main()
//{
//    //string a;
//    long long b;
//    cin >> a;
//    cin >> b;
//    int c = 0;
//    div(a, b, c);
//    long long d = b;
//    b = c;
//    long long A = max<long long>(d, b);
//    long long B = min<long long>(d, b);
//    while (B)
//    {
//        c = A % B;
//        A = B;
//        B = c;
//    }
//    cout << A;
//}
#include<bits/stdc++.h>
using namespace std;
int a[510][510];
int b[510][510];
int xrr[4] = { 0,0,1,-1 };
int yrr[4] = { 1,-1,0,0 };

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin >> b[i][j];
    memset(a, 0x3f3f3f3f, sizeof a);
    queue<pair<int, int>>q;
    q.push({ 0,0, });
    a[0][0] = b[0][0];
    while (q.size())
    {
        auto at = q.front();
        q.pop();
        int i = at.first, j = at.second;
        for (int k = 0; k < 4; k++)
        {
            int x1 = i + xrr[k];
            int y1 = j + yrr[k];
            if (x1 >= 0 && y1 >= 0 && x1 < n && y1 < n && a[i][j] < a[x1][y1])
            {
                q.push({ x1,y1 });
                a[x1][y1] = max(a[i][j], b[x1][y1]);
            }
        }
    }
    cout << a[n - 1][n - 1];
}